using System;
using System.Collections.Generic;

namespace Gltf
{
    public class ModelSpec : ExtensibleObject
    {
        public static string TypeName = "Model";

        /**
    * @brief Names of glTF extensions used in this asset.
    */
        public List<string> extensionsUsed;

        /**
         * @brief Names of glTF extensions required to properly load this asset.
         */
        public List<string> extensionsRequired=new List<string>();

        /**
         * @brief An array of accessors.
         *
         * An accessor is a typed view into a bufferView.
         */
        public List<Accessor> accessors=new List<Accessor>();

        /**
         * @brief An array of keyframe animations.
         */
        public List<Animation> animations=new List<Animation>();

        /**
         * @brief Metadata about the glTF asset.
         */
        public Asset asset;

        /**
         * @brief An array of buffers.
         *
         * A buffer points to binary geometry, animation, or skins.
         */
        public List<Gltf.Buffer> buffers=new List<Buffer>();

        /**
         * @brief An array of bufferViews.
         *
         * A bufferView is a view into a buffer generally representing a subset of the
         * buffer.
         */
        public List<BufferView> bufferViews=new List<BufferView>();

        /**
         * @brief An array of cameras.
         *
         * A camera defines a projection matrix.
         */
        public List<Camera> cameras=new List<Camera>();

        /**
         * @brief An array of images.
         *
         * An image defines data used to create a texture.
         */
        public List<Image> images=new List<Image> ();

        /**
         * @brief An array of materials.
         *
         * A material defines the appearance of a primitive.
         */
        public List<Material> materials=new List<Material>();

        /**
         * @brief An array of meshes.
         *
         * A mesh is a set of primitives to be rendered.
         */
        public List<Mesh> meshes=new List<Mesh>();

        /**
         * @brief An array of nodes.
         */
        public List<Node> nodes=new List<Node>();

        /**
         * @brief An array of samplers.
         *
         * A sampler contains properties for texture filtering and wrapping modes.
         */
        public List<Sampler> samplers;

        /**
         * @brief The index of the default scene.
         *
         * This property **MUST NOT** be defined, when `scenes` is undefined.
         */
        public int scene = -1;

        /**
         * @brief An array of scenes.
         */
        public List<Scene> scenes=new List<Scene>();

        /**
         * @brief An array of skins.
         *
         * A skin is defined by joints and matrices.
         */
        public List<Skin> skins;

        /**
         * @brief An array of textures.
         */
        public List<Texture> textures;

    }
}